Founding the Firm Part 1
Scope and Goal¶
My project for 2021 is to start my own financial planning firm. Specifically, the goals for this project will be to:
- [ ] Engage 1 paying client by December 31, 2021.
Milestones¶
- Business plan
- Create a legal entity for the business
- Get all the required licenses necessary to begin operations
- Complete professional development courses
- Develop statements of work, templates, charts, any other materials required for customers
- Marketing Plan
- Rollout!
Timeline¶
| Milestone | Activity | Dep.'s | Start | Stop | Duration (business days) |
|---|---|---|---|---|---|
| Business Plan | 1.1 Create list of services | 1/1/2021 | 1/1/2021 | 1 | |
| 1.2 Write company description | 1/4/2021 | 1/4/2021 | 1 | ||
| 1.3 Write market analysis | 1.2 | 1/5/2021 | 1/8/2021 | 4 | |
| 1.4 Write competitive analysis | 1/11/2021 | 1/15/2021 | 5 | ||
| 1.5 Write marketing plan | 1.3, 1.4 | 1/18/2021 | 1/20/2021 | 3 | |
| 1.6 Write executive summary | 1.2-1.5 | 1/21/2021 | 1/21/2021 | 1 | |
| 1.7 Final proofread and publish to blog | 1/22/2021 | 1/22/2021 | 1 | ||
| Legal entity | 2.1 Decide on a business structure | 1.7 | 1/25/2021 | 1/25/2021 | 1 |
| 2.2 Come up with an official name | 1/26/2021 | 1/26/2021 | 1 | ||
| 2.3 Register with state | 2.2 | 1/27/2021 | 1/27/2021 | 1 | |
| 2.4 Set up a bank account | 2.3 | 1/28/2021 | 1/28/2021 | 1 | |
| 2.5 Business phone #? | 2.4 | 1/29/2021 | 1/29/2021 | 1 | |
| Licensing & Legal Reqs | 3.1 Register and Study for Series 65 | 2/1/2021 | 2/26/2021 | 20 | |
| 3.2 Take Series 65 | 3.1 | 3/1/2021 | 3/2/2021 | 1 | |
| 3.3 Register RIA with state | 3.2 | 3/3/2021 | 3/4/2021 | 2 | |
| 3.4 Errors and Omissions Insurance | 3/5/2021 | 3/5/2021 | 1 | ||
| Professional Development | 4.1 Review and Personalize Curriculum | 3/8/2021 | 3/8/2021 | 1 | |
| 4.2 'Survey of Personal Financial Planning' | 4.1 | 3/9/2021 | 4/9/2021 | 24 | |
| 4.3 'Income Taxes and Personal Financial Planning' | 4.1 | 4/12/2021 | 5/14/2021 | 25 | |
| 4.4 'Investments in Personal Financial Planning' | 4.1 | 5/17/2021 | 6/18/2021 | 25 | |
| 4.5 'Insurance in Personal Financial Planning' | 4.1 | 6/21/2021 | 7/23/2021 | 24 | |
| 4.6 'Estate Planning' | 4.1 | 7/26/2021 | 8/27/2021 | 25 | |
| 4.7 'Employment Benefits and Retirement Planning' | 4.1 | 8/31/2021 | 10/1/2021 | 25 | |
| 4.8 'Personal Financial Planning Capstone' | 4.2-4.7 | 10/4/2021 | 11/5/2021 | 25 | |
| Develop Materials | 5.1 Develop Standard Reports | 4.8 | 11/8/2021 | 11/12/2021 | 5 |
| 5.2 Develop Statement of Work | 5.1 | 11/15/2021 | 11/19/2021 | 5 | |
| 5.3 Develop Standard Presentation | 5.1 | 11/22/2021 | 11/26/2021 | 5 | |
| Marketing Plan | 6.1 Ads | ||||
| Close the Sale | 7.1 Make a sale |
How I Built This Blog (Part 1)
Introduction¶
In the last post, we defined our technical requirements and (after some exploration) settled on Nikola as the platform for the blog. In this installment, we'll create an environment, install Nikola, get everything set up, build our first post, and then push the whole thing to GitHub pages.
Step 1 -- Creating the Repository¶
I'm assuming that you already have a good version of python 3 and git installed and that you already have an account on github
- Log in to github and create a new repository named
<yourUsername>.github.iowhere<yourUsername>is your username.- Choose a .gitignore for python, and a license if you want.
- Now you'll need to clone this new repository to the local machine where you'll be working.
- On a mac, I did this with
git clone git@github.com:shanewilkins/shanewilkins.github.io.gitfrom the directory above where I wanted the new project foldershanewilkins.io.gitto live.
- On a mac, I did this with
Step 2 -- Creating a Python Environment¶
- Navigate to the new project folder
cd <yourUsername>.github.io - Create a virtual environment for our project with
virtualenv venvwhich should create a new subfolder calledvenvin the project folder. - Activate the virtual environment with
source venv/bin/activate. You should see(venv)to the left of your command prompt.- You can do
python --versionorwhich pythonto make sure that the active version of python is the right version from the virtual environment.
- You can do
- Update the installed versions of the "seed" packages
python -m pip install -U pip setuptools wheel
Step 3 -- Installing Nikola and Initializing a Site¶
- Now we install
Nikolawithpip install "nikola[extras]". This will take a couple of minutes. Since Nikola supports Jupyter out of the box, Nikola has to depend on all of Jupyter's numerous dependencies too. - Once we have Nikola installed, we are ready to start the blog! All we have to do is
nikola initand Nikola will start an interactive prompt to guide us through some setup questions. (Don't worry about choosing the wrong thing--you can change all of these settings later inconf.py.) -
Open
conf.pyand make sure of three things:-
SITE_URL = "https://<yourUsername>.github.io", -
GITHUB_DEPLOY_BRANCH = 'main'(notmaster), and -
POSTScan find.ipynbwith
-
POSTS = (
...
("posts/*.ipynb", "posts", "post.tmpl")
)
Step 4 -- Writing the First Post¶
- Now to create your first post (which will be a Jupyter notebook) do
nikola new_post -f ipynband tell the prompt what you'd like the name of this post to be. (Note. all thenew_postcommand is really doing is populating notebook metadata, which you can edit later from inside Jupyter withEdit>Edit Notebook Metadata - Now fire up the notebook with
jupyter notebook, and you should find your new post in thepostsdirectory. - Write your post! :)
- Save the post and close Jupyter.
Step 5 -- Publish to Github Pages¶
- From the commandline in your main project folder now you can simply do
nikola github_deployand Nikola will automagically build the site, commit changes, and push to the remote repository. - Go get a cup of coffee.
- Now navigate in your browser of choice to
https://<yourUsername>.github.ioand, if all has gone well, you should see your brand new blog appear, courtesy of github pages.
How I Built This Blog (Part 0)
Hello World!¶
I will use this blog to post some of my personal data science projects and to work out some of my ideas. The primary goal is to keep myself writing code and building a portfolio of data science projects, but hopefully others will find something useful to read here as well.
As my first series of posts, I'm going to write about the project of creating the blog itself.
Let's begin by defining our requirements and then we can look to see what technologies we might adopt to fulfill these requirements.
- The first and most important requirement is that we want a python-based blogging platform easy to use. We want to spend our time writing content, not twiddling with configuration files or so on. Some additional features that would be nice to have in our blogging platform would be
- the ability for readers to leave comments or subscribe to future posts,
- use custom themes for styling the appearance, and
- ability to support LaTeX-style mathematics, preferably with KaTeX
- Second, we want to be able to keep all of our source code and other content in version control to ensure we have good offsite backups and to give us flexibility to move to a different platform in the future if our requirements change. I use git for my version control, so I'd like to be able to publish content to the site via git.
- Third, we'd really like to be able to write our content in Markdown files and post Jupyter Notebooks so that we can share code and visualizations as well as written text.
- Fourth, we'd like to have our own domain name.
- Fifth, we'd like to do all this as cheaply as possible ...
Choosing a Blogging Platform¶
Since Python is the language I'm the most comfortable in, I want a blogging platform that is based on python in case I ever need to try customizing something. My first thought when looking for a blogging platform was to build out a blog using Django following one of the numerous tutorials for building a blog with Django, since I'm very interested in building out a Django site in the future. Django would offer the ability to offer a dynamic site with a live database and build dashboards or other interactive visualizations that could be dynamically updated over time. On the other hand, the benefits of a dynamic site are purchased with considerably increased complexity. Since I am much more interested in writing a blog than I am in writing blogging software and the benefits of a dynamic site do not appear immediately useful, I settled on the idea of doing something much simpler, which meant using a static site.
Having decided on using a static site, the choice of python static blog generator platforms gets basically comes down to Pelican vs Nikola (no, not that Nikola). Both platforms support rich sets of features including plugins, themes, and extensions. Both options have all the features we identified earlier in our requirements:
| Feature | Nikola | Pelican |
|---|---|---|
| Easy static sites? | Y | Y |
| Comments? | Y | Y |
| Custom themes? | Y | Y |
| LaTeX support? | Y | Y |
| Markdown? | Y | Y |
| Jupyter notebooks? | Y | Y |
| Publish with git? | Y | Y |
In point of fact, I've only discovered two small differences between the two packages.
First, Nikola offers a neat incremental build system that only rebuilds existing content if the source for that post has changed, whereas Pelican appears to rebuild every post every time. In theory the incremental builds could be a real time-saver if one had a large number of posts.
The second, and potentially more significant difference between the two platforms comes in the user base. As of the time of this writing, Pelican has 10k stars on github and Nikola has only 2k. To be sure, both projects have established user bases and have ongoing development and support, but I have a strong preference for the larger user base. A larger user base means more people out there writing plugins, documentation, and answering stack overflow questions, and that's what I want.
Update 12/20/2020¶
Although, I initially chose Pelican because of it's larger userbase, I ended up changing my mind because although Pelican does have plugins that support notebooks, Pelican itself does not do so out of the box.
Both plugins I tried (pelican-jupyter and ipython) do not appear to be actively maintained.
So, I ended up very quickly trapped in the realm of hunting through documentation and trying to resolve version conflicts.
That was the opposite of what I was looking for, so I changed my mind.
So far, I'm very pleased with Nikola. The build time is noticably faster and the built in support for Jupyter notebooks is really good.
Test Post!
Test Post¶
Basic Markdown Functions¶
Text¶
italics
bold
~strikethrough~
blockquotes
Lists:¶
Ordered¶
- One
- Two
Unordered¶
- Cat
- Bat
Checkboxes¶
- [x] Checkboxes
- [ ] Theorem environments
(For some reason, as of the time of writing the checkboxes also have bullets beside them, which is not desired.)
Unicode text¶
μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος
οὐλομένην, ἣ μυρί᾽ Ἀχαιοῖς ἄλγε᾽ ἔθηκε,
πολλὰς δ᾽ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν
ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν
5οἰωνοῖσί τε πᾶσι, Διὸς δ᾽ ἐτελείετο βουλή,
ἐξ οὗ δὴ τὰ πρῶτα διαστήτην ἐρίσαντε
Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς.
Images from the web¶

Mathematics¶
The flavor of Markdown I'm using supports $\LaTeX$ typesetting of mathematics via MathJax.
For instance, here are Maxwell's equations:
\begin{align} \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ \nabla \cdot \vec{\mathbf{B}} & = 0 \end{align}It doesn't seem to support theorem environments, alas.
Python code¶
# a comment
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from urllib.request import urlopen
import json
Data frames¶
df = px.data.iris()
df
# example graph using the Iris dataset
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", marginal_y="violin",
marginal_x="box", trendline="ols", template="simple_white")
fig.show()
Scatterplots¶
# the same dataset in 3d
fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
color='species')
fig.show()
Area charts¶
Another example visualizing topographical data with a color scheme.
# 3D surface example plot from the plotly docs
# Read data from a csv
z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')
fig = go.Figure(data=[go.Surface(z=z_data.values)])
fig.update_layout(title='Mt Bruno Elevation', autosize=False,
width=500, height=500,
margin=dict(l=65, r=50, b=65, t=90))
fig.show()
Geodata visualizations¶
Another cool chloropleth example from the docs that utilizes GeoJSON to visualize the unemployment rate in the US by county.
with urlopen('https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json') as response:
counties = json.load(response)
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv",
dtype={"fips": str})
fig = px.choropleth_mapbox(df, geojson=counties, locations='fips', color='unemp',
color_continuous_scale="Viridis",
range_color=(0, 12),
mapbox_style="carto-positron",
zoom=3, center = {"lat": 37.0902, "lon": -95.7129},
opacity=0.5,
labels={'unemp':'unemployment rate'}
)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()